/**
 * 
 */
package com.lifeware.research.endo.models.utils;

import java.io.UnsupportedEncodingException;
import java.security.InvalidKeyException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;

import javax.crypto.Cipher;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.SecretKeySpec;

import org.springframework.stereotype.Component;

/**
 * <p>Effettua la crittazione sulla base di una chiave AES a 128 caratteri. 
 * </p>
 * 
 * @author  Riccardo Cardin, (C) 2012 Lifeware
 * @version 1.0
 */
@Component
public class AesEncrypter implements IEncrypter {
	
	private final static String CLEAR_KEY_AES = "sfsv5678saf98dsy9ds98g9sadgd8s";
	
	/**
	 * Struttura di crittazione
	 */
	private Cipher encryptCipher;
	
	/**
	 * Struttura di decrittazione;
	 */
	private Cipher decryptCipher;
	
	public AesEncrypter() 
	throws UnsupportedEncodingException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException {
		
		byte[] key = CLEAR_KEY_AES.getBytes("UTF-8");
		MessageDigest sha = MessageDigest.getInstance("SHA-1");
		key = sha.digest(key);
		key = Arrays.copyOf(key, 16); // use only first 128 bit

		/* Inizializzo le strutture di crittazione */
		SecretKeySpec secretKeySpec = new SecretKeySpec(key, "AES");
		this.encryptCipher = Cipher.getInstance("AES");
		this.decryptCipher = Cipher.getInstance("AES");
		
		/* Inizializzo la struttura di crittazione */
		this.encryptCipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);
		
		/* Inizializzo la struttura di decrittazione */
		this.decryptCipher.init(Cipher.DECRYPT_MODE, secretKeySpec);
	}
	
	/* (non-Javadoc)
	 * @see com.lifeware.research.endo.models.utils.IEncrypter#encrypt(java.lang.String)
	 */
	@Override
	public String encrypt(String stringToEncrypt) throws EncryptException {
		
		byte[] encryptedBytes = null;
		
		try {
			
			/* Effettuo la crittazione */
			encryptedBytes = 
					this.encryptCipher.doFinal(
							stringToEncrypt.getBytes("UTF-8"));
		} catch (Exception e) {
			
			throw new EncryptException(e);
		} 
		
		return new String(encryptedBytes);
	}
}
